package cn.qingfeng.a002_chat.server.handler;

import cn.qingfeng.a002_chat.server.session.Session;
import cn.qingfeng.a002_chat.server.session.SessionFactory;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.internal.StringUtil;

@ChannelHandler.Sharable
public class SendHandler extends SimpleChannelInboundHandler<String> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        // "[fromUsername] send [toUsername] [content]"
        final Session session = SessionFactory.getSession();

        if (StringUtil.isNullOrEmpty(msg)) {
            return;
        }
        String[] msgArray = msg.split(" ");
        String instruction = msgArray[1];

        if ("send".equals(instruction)) {
            String fromUsername = msgArray[0];
            String toUsername = msgArray[2];
            String content = msgArray[3];
            Channel toChannel = session.getChannel(toUsername);
            toChannel.writeAndFlush(fromUsername + ":" + content);
        } else {
            // 如果没有匹配上，就触发channelread事件，让消息继续向下一个handler传播。
            // > 因为这里所有的业务handler都是String类型的消息，通过if来区分，消息无法精确判断应该使用哪一个handler。
            // > 所以消息需要走遍所有的handler，一个一个试。
            // > 如果没有匹配上，就需要继续向下一个handler传递，继续匹配。
            // > 如果msg是特制的消息类就可以根据类型精确匹配到某个handler，就不需要fireChannelRead了。
            ctx.fireChannelRead(msg);
        }
    }
}